iT邦幫忙

2024 iThome 鐵人賽

DAY 3
0

前言

本次教程中會使用到這三項來輔助開發一套完整的後端系統,我們會從簡單的組合開始介紹,也就是從Spring Boot + Spring Data,再到Spring Boot + Spring Data + Spring Security

但是在那之前,我們還是先針對這幾項進行簡單的介紹

Spring Boot

Spring Boot 透過提供自動配置、簡化依賖管理、內嵌服務器等特性,大大簡化了 Spring 應用的開發過程。它遵循「約定優於配置」的原則,減少了樣板代碼和配置的需求,讓開發者能夠加速開發過程。

其中最直觀的一個差異就是在啟動應用時,沒使用Spring Boot需要手寫一長串的配置,大概像這樣:

public class WebAppInitializer implements WebApplicationInitializer {  
    @Override  
    public void onStartup(ServletContext servletContext) throws ServletException {  
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();  
        context.register(AppConfig.class);  
        servletContext.addListener(new ContextLoaderListener(context));  
        
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(context));  
        dispatcher.setLoadOnStartup(1);  
        dispatcher.addMapping("/");  
    }  
}

這串程式碼的主要用意,是為了要設置 Spring Web 應用,首先創建一個基於 Spring 應用的 Context,接著註冊自己設定的 AppConfig,然後添加加載器的監聽器,最後配置 DispatcherServlet

看著就十分麻煩,因此若有使用Spring Boot ,我們可以將這段程式碼簡化成下面這樣:

@SpringBootApplication  
public class Application {  
    public static void main(String[] args) {  
        SpringApplication.run(Application.class, args);  
    }  
}

其他便利的設定還有,配置屬性時,使用Spring Boot可以很簡單的在 application.properties 中設定相關的設定:

spring.datasource.url=jdbc:mysql://localhost:3306/mydb  
spring.datasource.username=user  
spring.datasource.password=password  

如果沒有使用就必須先創建屬性文件,並在Spring 配置文件中明確加載這個屬性文件

Spring Data

Spring Data 簡化了數據訪問層的開發。它提供了一種熟悉且一致的基於Spring的編程模型,同時仍保留底層數據存儲的特殊特性。

在後端開發過程中,少不了的就是資料庫的建立,我們可以透過 Spring Data 快速建立相關的設定,像是DAO的設計

在未使用的情況下,我們需要寫清楚每個功能的SQL查詢

@Repository  
public class UserRepositoryImpl implements UserRepository {  
    @Autowired  
    private JdbcTemplate jdbcTemplate;  

    public List<User> findByName(String name) {  
        return jdbcTemplate.query(  
            "SELECT * FROM users WHERE name = ?",  
            new Object[]{name},  
            (rs, rowNum) ->  
                new User(  
                    rs.getLong("id"),  
                    rs.getString("name"),  
                    rs.getString("email")  
                )  
        );  
    } 
}  

相反的,如果有使用 Spring Data 的話,就可以縮減成這樣

public interface UserRepository extends JpaRepository<User, Long> {  
    List<User> findByName(String name); 
}  

Spring Data 提供了在 Repository 接口中定義特定的方法名稱來快速創建所需的查詢方法
這邊列出一些常用的方法名稱

常用的方法名稱及前綴

  • find...By
  • get...By
  • query...By
  • read...By
  • count...By
  • exists...By

常用的關鍵字

  • And, Or
  • Is, Equals
  • Between
  • LessThan, LessThanEqual, GreaterThan, GreaterThanEqual
  • After, Before
  • IsNull, IsNotNull, NotNull
  • Like, NotLike
  • StartingWith, EndingWith, Containing
  • OrderBy
  • Not, In, NotIn
  • True, False
  • IgnoreCase

以及結合上述的常用方法、前綴和關鍵字的一些使用範例:

public interface UserRepository extends JpaRepository<User, Long> {  
    // 根據名字查找用戶  
    List<User> findByName(String name);  

    // 根據名字和郵箱查找用戶  
    User findByNameAndEmail(String name, String email);  

    // 查找年齡大於指定值的用戶  
    List<User> findByAgeGreaterThan(int age);  

    // 查找名字包含特定字符串的用戶,忽略大小寫  
    List<User> findByNameContainingIgnoreCase(String namePart);  

    // 根據年齡範圍查找用戶,並按名字排序  
    List<User> findByAgeBetweenOrderByNameAsc(int ageFrom, int ageTo);  

    // 查找特定城市的活躍用戶  
    List<User> findByAddressCityAndActiveTrue(String city);  

    // 統計特定郵箱域名的用戶數量  
    long countByEmailEndingWith(String emailDomain);  

    // 檢查是否存在特定名字的用戶  
    boolean existsByName(String name);  
}  

Spring Security

Spring Security是一個功能強大且高度自定義的認證和訪問控制框架。它是保護基於Spring的應用程式的事實標準。

想要一個後端服務系統變的完整,另外一個重要的項目就是安全性,我們可以透過 Spring Security 為我們的後端服務添加像是:

  • 帳戶權限
    我們可以設定一個用戶在註冊時的角色權限,並設定特定的 API 服務需要不同權限才可以使用,例如:我們可以設定「一般使用者、擁有者」這兩種角色,接著設定一個API 服務需要 擁有者 的權限才可以使用。

  • 身分認證
    我們可以使用像是「JWT、OAuth 2.0、HTTP Basic 認證...」等等的身分認證方式,做到避免未經系統認證的請求通過。

  • 安全標頭
    Spring Security 自動添加了一些安全標頭,像是「X-XSS-Protection、X-Frame-Options、X-Content-Type-Options...」。

  • CSRF保護
    Spring Security默認啟用CSRF (跨站請求偽造) 保護。

總結

藉由上述介紹的各種加速開發的工具,在後端開發上可以節省很多時間,也避免了各種需要重複設計的版面,不但讓程式碼更簡潔也讓程式碼在維護上更加輕鬆。


上一篇
[DAY 02] Spring 框架介紹
下一篇
[DAY 04] 開發 Spring 環境的工具 IntelliJ IDEA 介紹
系列文
智慧語義互動平台:基於Spring和Semantic Kernel的Android應用創新20
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言